From bd287ba3cf9293f360ea3f9093b8ef4389587f00 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 4 Nov 2017 15:09:43 +0100 Subject: [PATCH] renderer: Assert having been unrealized in dispose We cannot unrealize a renderer in the dispose function, because that would cause this chain to happen: gsk_gl_renderer_dispose gsk_renderer_dispose gsk_renderer_unrealize gsk_gl_renderer_unrealize So we would call into thje GL renderers unrealize when it has already (partially) disposed itself and ause accesses to dead variables. --- gsk/gskrenderer.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c index c04bbc33de..a769bd4c12 100644 --- a/gsk/gskrenderer.c +++ b/gsk/gskrenderer.c @@ -170,7 +170,9 @@ gsk_renderer_dispose (GObject *gobject) GskRenderer *self = GSK_RENDERER (gobject); GskRendererPrivate *priv = gsk_renderer_get_instance_private (self); - gsk_renderer_unrealize (self); + /* We can't just unrealize here because superclasses have already run dispose. + * So we insist that unrealize must be called before unreffing. */ + g_assert (!priv->is_realized); g_clear_object (&priv->profiler); g_clear_object (&priv->display); -- 2.30.2